package com.lei.study;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.serialize.SerializableSerializer;

import java.util.List;

/**
 * zkClient - test
 * zkClient 解决了原生监听器只能监听一次的问题
 *
 * @author 伍磊
 */
public class ZkClientTest {

    public static void main(String[] args) throws Exception {
        ZkClient zkClient = new ZkClient("localhost:2181", 10000, 10000, new SerializableSerializer());

        // 创建持久节点
        if (!zkClient.exists("/zkClient-1")) {
            zkClient.createPersistent("/zkClient-1", "zk".getBytes());
        } else {
            System.out.println("节点已存在!");
        }

        // 监听数据被修改了
        // 此数据需要通过此api进行修改 直接通过命令修改不生效
        zkClient.subscribeDataChanges("/zkClient-1", new IZkDataListener() {
            @Override
            public void handleDataChange(String s, Object o) throws Exception {
                // s -> 节点名称 o -> 修改后的数据
                System.out.println("修改的数据节点为: " + s);
                System.out.println("修改后的数据为：" + o);
            }

            @Override
            public void handleDataDeleted(String s) throws Exception {
                System.out.println("数据被删除了: " + s);
            }
        });

        // 监听子节点改变
        zkClient.subscribeChildChanges("/zkClient-1", new IZkChildListener() {

            @Override
            public void handleChildChange(String s, List<String> list) throws Exception {
                // s->父节点  list:当前改变后的所有子节点
                System.out.println("子节点改变了: " + s + "|" + list);
            }
        });


        System.in.read();
    }
}
